package com.wenjiang.websocket;

import com.wenjiang.common.vo.PaySuccessVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 *  websocket的中转站 （相当于websocket的服务器）
 */
@Component
@Slf4j
@ServerEndpoint("/api/websocket/{sid}")
public class WebSocketServe {

    //当前连接数
    private  static  int onlinecount=0;
    //存放连接用户的集合
    private  static CopyOnWriteArraySet<WebSocketServe> webSets= new CopyOnWriteArraySet<>();
    //当前连接的session
    private Session session;
    //传过来的sid 表示连接用户的唯一标识
    private  String sid="";

    /**
     * 连接成功时触发的方法
     */
    @OnOpen
    public  void onOpen(Session session, @PathParam("sid")String sid){
        //赋值
        this.session=session;
        this.sid=sid;
        //在线人数加1
        addonline();
        //存进容器中
        webSets.add(this);
        try {
//            //告诉连接用户连接成功
//            sendMessage("连接成功");
            //新连接的用户
            log.info("新窗口开始监听:"+sid+"当前在线人数"+onlinecount);
        }catch (Exception e){
            e.printStackTrace();
        }

    }
    /**
     *发生错误时的方法
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
        error.printStackTrace();
    }


    /**
     * 退出连接时的方法
     *
     * @throws IOException
     */
    @OnClose
    public  void  onClose(){
        log.info("关闭连接的id为"+sid);
        //在容器中移除
        webSets.remove(this);
        //在线人数减1
        subonline();
        log.info("一连接关闭:"+sid+"当前在线人数"+onlinecount);

    }

    /**
     * 当用户端向服务端发信息是触发
     * @param message
     * @param session
     */
    @OnMessage
    public  void onMessage(String message,Session session){

        log.info("收到来自"+sid+"信息"+message);

        //群发信息 (遍历集合)
        for (WebSocketServe webSocketServe:webSets){
            try {
                webSocketServe.sendMessage(message);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

    }




    //向某人发送请求
    public  static  void  sendinfo(String message,@PathParam("sid") String sid){
        log.info("收到来自"+sid+"信息"+message);

        //群发信息 (遍历集合)
        for (WebSocketServe webSocketServe:webSets){
            try {
                //为空时默认群发
                if(sid==null)
                {webSocketServe.sendMessage(message);}
                //相等时发送
                else if(webSocketServe.sid.equals(sid))
                { webSocketServe.sendMessage(message);}
                else {
                 //没有时跳过
                    continue;
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    //群发信息 发送某个对象
    public  void sendAllInfo(Object message){
        for (WebSocketServe webSocketServe:webSets){
            try {
                webSocketServe.sendObject(message);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    //服务器反向推送
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
    //服务器反向推送
    public void sendObject(Object object) throws IOException, EncodeException {
        this.session.getBasicRemote().sendObject(object);
    }


    //在线人数加1
    public  static synchronized  void addonline(){
        onlinecount++;
    }

    //在线人数减一
    public  static synchronized  void subonline(){
        onlinecount--;
    }

    public  static  CopyOnWriteArraySet<WebSocketServe> getWebSets(){
        return webSets;
    }




}
